package com.cmcc.pcap.packet.sctp.ngaps.xdr;

import com.cmcc.packet.entity.NGAP.NgapEntity;
import com.cmcc.pcap.packet.sctp.SctpPacketDecorator;
import com.cmcc.pcap.packet.sctp.ngaps.NgapMessages;
import com.ericsson.mts.asn1.NGAPDecoder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.pcap4j.packet.SctpPacket;
import org.pcap4j.packet.namednumber.SctpChunkType;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class NgapXdrGenerate {

    private static Logger logger = LogManager.getLogger(NgapXdrGenerate.class);
    public List<NgapEntity> generate(NgapMessages ngapMessages, String taskId) {
        List<NgapEntity> ngapEntityList = new ArrayList<NgapEntity>();
        NGAPDecoder decoder = new NGAPDecoder();
        logger.debug("this is ngap generate !");
        try {
            ngapEntityList = saveNgapConnectionToEntityList(ngapMessages, taskId, decoder);
        } catch (ParseException e) {
            logger.error(e.getCause(), e);
        }

        return ngapEntityList;
    }

    private List<NgapEntity> saveNgapConnectionToEntityList(NgapMessages ngapMessages, String taskId, NGAPDecoder decoder) throws ParseException{
        List<NgapEntity> ngapList = new ArrayList<>();
        String serverAddr = ngapMessages.sctpconnection.serverAddr;
        String clientAddr = ngapMessages.sctpconnection.clientAddr;
        String srcIp = serverAddr.split(":")[0];
        String srcPort = serverAddr.split(":")[1];
        String dstIp = clientAddr.split(":")[0];
        String dstPort = serverAddr.split(":")[1];
        for(SctpPacketDecorator spd:ngapMessages.al_filtered){
            List<SctpPacket.SctpChunk> datachunklist = spd.sctpPacket.getHeader().getChunks();
            datachunklist.forEach(sctpChunk -> {
                // 仅解析sctp中的payload中的NGAP协议
                if(sctpChunk.getType().name().equals(SctpChunkType.DATA.name())){
                    NgapEntity ngapEntity = new NgapEntity();
                    ngapEntity.setSctpChunkType(sctpChunk.getType().name());
                    ngapEntity.setTaskId(Integer.valueOf(taskId));
                    ngapEntity.setTime(spd.receiveTime);
                    ngapEntity.setSctpSrcIp(srcIp);
                    ngapEntity.setSctpSrcPort(srcPort);
                    ngapEntity.setSctpDstIp(dstIp);
                    ngapEntity.setSctpDstPort(dstPort);
                    ngapEntity.setSctpPayloadProtocol("NGAP");
                    try {
                        // decode NGAP 消息
                        ngapMessages.decodeNgapPdu(sctpChunk, ngapEntity, decoder);
                        ngapList.add(ngapEntity);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
        }
        return ngapList;
    }
}